{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# XGBoost Parameter Tuning for Rent Listing Inqueries \n",
    "\n",
    "Rental Listing Inquiries数据集是Kaggle平台上的一个分类竞赛任务，需要根据公寓的特征来预测其受欢迎程度（用户感兴趣程度分为高、中、低三类）。其中房屋的特征x共有14维，响应值y为用户对该公寓的感兴趣程度。评价标准为logloss。\n",
    "数据链接：https://www.kaggle.com/c/two-sigma-connect-rental-listing-inquiries"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 1. 直接调用xgboost内嵌的cv寻找最佳的参数n_estimators"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "首先 import 必要的模块"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "from __future__ import print_function\n",
    "from __future__ import division\n",
    "from xgboost import XGBClassifier\n",
    "import xgboost as xgb\n",
    "\n",
    "import pandas as pd \n",
    "import numpy as np\n",
    "\n",
    "from sklearn.metrics import log_loss\n",
    "\n",
    "from matplotlib import pyplot\n",
    "import seaborn as sns\n",
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 读取数据"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style>\n",
       "    .dataframe thead tr:only-child th {\n",
       "        text-align: right;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: left;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>bathrooms</th>\n",
       "      <th>bedrooms</th>\n",
       "      <th>price</th>\n",
       "      <th>price_bathrooms</th>\n",
       "      <th>price_bedrooms</th>\n",
       "      <th>room_diff</th>\n",
       "      <th>room_num</th>\n",
       "      <th>Year</th>\n",
       "      <th>Month</th>\n",
       "      <th>Day</th>\n",
       "      <th>...</th>\n",
       "      <th>walk</th>\n",
       "      <th>walls</th>\n",
       "      <th>war</th>\n",
       "      <th>washer</th>\n",
       "      <th>water</th>\n",
       "      <th>wheelchair</th>\n",
       "      <th>wifi</th>\n",
       "      <th>windows</th>\n",
       "      <th>work</th>\n",
       "      <th>interest_level</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1.5</td>\n",
       "      <td>3</td>\n",
       "      <td>3000</td>\n",
       "      <td>1200.0</td>\n",
       "      <td>750.000000</td>\n",
       "      <td>-1.5</td>\n",
       "      <td>4.5</td>\n",
       "      <td>2016</td>\n",
       "      <td>6</td>\n",
       "      <td>24</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>1.0</td>\n",
       "      <td>2</td>\n",
       "      <td>5465</td>\n",
       "      <td>2732.5</td>\n",
       "      <td>1821.666667</td>\n",
       "      <td>-1.0</td>\n",
       "      <td>3.0</td>\n",
       "      <td>2016</td>\n",
       "      <td>6</td>\n",
       "      <td>12</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>1.0</td>\n",
       "      <td>1</td>\n",
       "      <td>2850</td>\n",
       "      <td>1425.0</td>\n",
       "      <td>1425.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>2.0</td>\n",
       "      <td>2016</td>\n",
       "      <td>4</td>\n",
       "      <td>17</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>1.0</td>\n",
       "      <td>1</td>\n",
       "      <td>3275</td>\n",
       "      <td>1637.5</td>\n",
       "      <td>1637.500000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>2.0</td>\n",
       "      <td>2016</td>\n",
       "      <td>4</td>\n",
       "      <td>18</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>1.0</td>\n",
       "      <td>4</td>\n",
       "      <td>3350</td>\n",
       "      <td>1675.0</td>\n",
       "      <td>670.000000</td>\n",
       "      <td>-3.0</td>\n",
       "      <td>5.0</td>\n",
       "      <td>2016</td>\n",
       "      <td>4</td>\n",
       "      <td>28</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>5 rows × 228 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "   bathrooms  bedrooms  price  price_bathrooms  price_bedrooms  room_diff  \\\n",
       "0        1.5         3   3000           1200.0      750.000000       -1.5   \n",
       "1        1.0         2   5465           2732.5     1821.666667       -1.0   \n",
       "2        1.0         1   2850           1425.0     1425.000000        0.0   \n",
       "3        1.0         1   3275           1637.5     1637.500000        0.0   \n",
       "4        1.0         4   3350           1675.0      670.000000       -3.0   \n",
       "\n",
       "   room_num  Year  Month  Day       ...        walk  walls  war  washer  \\\n",
       "0       4.5  2016      6   24       ...           0      0    0       0   \n",
       "1       3.0  2016      6   12       ...           0      0    0       0   \n",
       "2       2.0  2016      4   17       ...           0      0    0       0   \n",
       "3       2.0  2016      4   18       ...           0      0    0       0   \n",
       "4       5.0  2016      4   28       ...           0      0    1       0   \n",
       "\n",
       "   water  wheelchair  wifi  windows  work  interest_level  \n",
       "0      0           0     0        0     0               1  \n",
       "1      0           0     0        0     0               2  \n",
       "2      0           0     0        0     0               0  \n",
       "3      0           0     0        0     0               2  \n",
       "4      0           0     0        0     0               2  \n",
       "\n",
       "[5 rows x 228 columns]"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# path to where the data lies\n",
    "dpath = './data/'\n",
    "train = pd.read_csv(dpath + \"RentListingInquries_FE_train.csv\")\n",
    "train.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "RangeIndex: 49352 entries, 0 to 49351\n",
      "Columns: 228 entries, bathrooms to interest_level\n",
      "dtypes: float64(9), int64(219)\n",
      "memory usage: 85.8 MB\n"
     ]
    }
   ],
   "source": [
    "train.info()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 准备数据"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "y_train = train['interest_level']\n",
    "\n",
    "train = train.drop([ \"interest_level\"], axis=1)\n",
    "X_train = train"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# 训练样本6w+，交叉验证太慢，用train_test_split估计模型性能\n",
    "from sklearn.model_selection import train_test_split\n",
    "X_train_part, X_val, y_train_part, y_val = train_test_split(X_train, y_train, train_size = 0.33,random_state = 0)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "默认参数，此时学习率为0.1，比较大，观察弱分类数目的大致范围"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "#直接调用xgboost内嵌的交叉验证（cv），可对连续的n_estimators参数进行快速交叉验证\n",
    "#而GridSearchCV只能对有限个参数进行交叉验证\n",
    "def modelfit(alg, X_train, y_train, cv_folds=5, early_stopping_rounds=10):\n",
    "    xgb_param = alg.get_xgb_params()\n",
    "    xgb_param['num_class'] = 3\n",
    "    \n",
    "    #直接调用xgboost，而非sklarn的wrapper类\n",
    "    xgtrain = xgb.DMatrix(X_train, label = y_train)\n",
    "     \n",
    "    cvresult = xgb.cv(xgb_param, xgtrain, num_boost_round=alg.get_params()['n_estimators'], nfold=cv_folds,\n",
    "                      metrics='mlogloss', early_stopping_rounds=early_stopping_rounds)\n",
    "  \n",
    "    cvresult.to_csv('1_nestimators.csv', index_label = 'n_estimators')\n",
    "    \n",
    "    #最佳参数n_estimators\n",
    "    n_estimators = cvresult.shape[0]\n",
    "    \n",
    "    # 采用交叉验证得到的最佳参数n_estimators，训练模型\n",
    "    alg.set_params(n_estimators = n_estimators)\n",
    "    alg.fit(X_train, y_train, eval_metric='mlogloss')\n",
    "        \n",
    "    #Predict training set:\n",
    "    #train_predprob = alg.predict_proba(X_train)\n",
    "    #logloss = log_loss(y_train, train_predprob)\n",
    "\n",
    "   #Print model report:\n",
    "   # print (\"logloss of train :\" )\n",
    "   # print logloss"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "scrolled": true
   },
   "outputs": [],
   "source": [
    "#params = {\"objective\": \"multi:softprob\", \"eval_metric\":\"mlogloss\", \"num_class\": 9}\n",
    "xgb1 = XGBClassifier(\n",
    "        learning_rate =0.1,\n",
    "        n_estimators=1000,  #数值大没关系，cv会自动返回合适的n_estimators\n",
    "        max_depth=6,\n",
    "        min_child_weight=1,\n",
    "        gamma=0,\n",
    "        subsample = 0.5,\n",
    "        colsample_bytree=0.8,\n",
    "        colsample_bylevel=0.7,\n",
    "        objective= 'multi:softprob',\n",
    "        seed=3)\n",
    "\n",
    "modelfit(xgb1, X_train, y_train)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'base_score': 0.5,\n",
       " 'booster': 'gbtree',\n",
       " 'colsample_bylevel': 0.7,\n",
       " 'colsample_bytree': 0.8,\n",
       " 'gamma': 0,\n",
       " 'learning_rate': 0.1,\n",
       " 'max_delta_step': 0,\n",
       " 'max_depth': 6,\n",
       " 'min_child_weight': 1,\n",
       " 'missing': None,\n",
       " 'n_estimators': 263,\n",
       " 'nthread': 1,\n",
       " 'objective': 'multi:softprob',\n",
       " 'reg_alpha': 0,\n",
       " 'reg_lambda': 1,\n",
       " 'scale_pos_weight': 1,\n",
       " 'seed': 3,\n",
       " 'silent': 1,\n",
       " 'subsample': 0.5}"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "xgb1.get_xgb_params()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x24be846eef0>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "cvresult = pd.DataFrame.from_csv('1_nestimators.csv')\n",
    "        \n",
    "# plot\n",
    "test_means = cvresult['test-mlogloss-mean']\n",
    "test_stds = cvresult['test-mlogloss-std'] \n",
    "        \n",
    "train_means = cvresult['train-mlogloss-mean']\n",
    "train_stds = cvresult['train-mlogloss-std'] \n",
    "\n",
    "x_axis = range(0, cvresult.shape[0])\n",
    "        \n",
    "pyplot.errorbar(x_axis, test_means, yerr=test_stds ,label='Test')\n",
    "pyplot.errorbar(x_axis, train_means, yerr=train_stds ,label='Train')\n",
    "pyplot.title(\"XGBoost n_estimators vs Log Loss\")\n",
    "pyplot.xlabel( 'n_estimators' )\n",
    "pyplot.ylabel( 'Log Loss' )\n",
    "pyplot.savefig( 'n_estimators4_1.png' )\n",
    "\n",
    "pyplot.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "\n"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.1"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
